package org.example.task.controller;


import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.example.task.converter.TaskConverterMapper;
import org.example.task.model.dto.PageDTO;
import org.example.task.model.dto.task.CreateTaskDTO;
import org.example.task.model.dto.task.UpdateTaskDTO;
import org.example.task.model.po.LoginUser;
import org.example.task.model.po.Task;
import org.example.task.model.query.TaskPageQuery;
import org.example.task.model.vo.R;
import org.example.task.model.vo.task.TaskPageVO;
import org.example.task.service.ITaskService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * 任务模块
 *
 * @module 任务模块
 */
@RestController
@RequestMapping("/task")
@RequiredArgsConstructor
public class TaskController {
    private final ITaskService taskService;
    private final TaskConverterMapper taskConverter;

    /**
     * 创建任务接口
     *
     * @param createTaskDTO task表单
     * @return 结果
     */
    @PreAuthorize("hasAuthority('task_create')")
    @PostMapping("/create")
    public R createTask(@Valid @RequestBody CreateTaskDTO createTaskDTO) {
        boolean flag = taskService.createTask(createTaskDTO);
        if (flag) {
            return R.success();
        }
        return R.error("创建失败");
    }

    /**
     * 更新任务状态
     *
     * @param updateTaskDTO 更新数据
     * @return 结果
     */
    @PreAuthorize("hasAuthority('task_edit')")
    @PutMapping("/status")
    public R updateTaskStatus(@Valid @RequestBody UpdateTaskDTO updateTaskDTO) {
        Task task = taskConverter.updateTaskDTOToTask(updateTaskDTO);
        task.setUpdateTime(LocalDateTime.now());
        boolean flag = taskService.updateById(task);
        if (flag) {
            return R.success();
        }
        return R.error("更新失败");
    }

    /**
     * 查询任务列表
     *
     * @param taskPageQuery 查询数据
     * @return 查询结果
     */
    @PreAuthorize("hasAuthority('task_list')")
    @GetMapping("/list")
    public R<PageDTO<TaskPageVO>> getTaskList(@Valid @RequestBody TaskPageQuery taskPageQuery) {
        PageDTO<TaskPageVO> result = taskService.getTaskPage(taskPageQuery);
        return R.success(result);
    }
}
